"""
在大模型(如：GPT、Qwen、DeepSeek等) 的推理场景中，FastAPI 是一个高效、轻量级的Python Web 框架
专为构建高性能的API设计。
它结合异步编程(async/await)、自动数据验证(基于 Pydantic) 和强大的依赖注入系统，
非常适合处理高并发的大模型推理任务


FastAPI结合了异步编程、自动数据验证和类型安全的特性，使得开发高性能、可扩展的 API 变得简单高效。
* 构建 RESTful API：适合开发需要高性能和类型安全的 API 服务。
* 微服务架构：作为微服务的一部分，提供高效的接口。
* 机器学习推理服务：结合大模型（如 Hugging Face Transformers）构建推理 API。
* 实时数据流：通过 WebSocket 或 SSE 实现实时数据推送。


一、FastAPI
为什么选择FastAPI构建推理服务？FastAPI 是一个基于 Python 的现代 Web 框架，专为构建高性能 API 而设计。
以下是选择 FastAPI 构建推理服务的核心原因：

1. 极致性能：异步 + 高并发
* 异步非阻塞 IO：FastAPI 基于 Starlette 和 Pydantic，原生支持异步编程（async/await），能高效处理大量并发请求，避免线程阻塞。
* 示例：推理服务需同时响应多个用户请求（如智能客服），FastAPI 的异步特性可显著降低延迟。
* 性能对比：在基准测试中，FastAPI 的性能接近（甚至超过）Node.js 和 Go，远超传统同步框架（如 Flask、Django）。

2. 开发效率：类型安全 + 自动文档
* 类型安全：FastAPI 强制使用 Python 类型注解（Type Hints），减少因参数错误导致的运行时崩溃。
* 自动生成交互式文档：FastAPI 自动生成 Swagger UI 和 ReDoc 文档，便于前后端联调和测试。
* FastAPI 可直接调用 PyTorch、TensorFlow 等深度学习模型，适合推理场景。

3. 生态兼容：深度学习框架无缝集成
* 与 PyTorch/TensorFlow 无缝对接：FastAPI 可直接调用 PyTorch、TensorFlow 等深度学习模型，适合推理场景。
* 示例：使用 transformers 加载模型，通过 FastAPI 提供推理接口。
* 支持 GPU 加速：FastAPI 可与 CUDA 无缝协作，充分利用 GPU 提升推理速度。


二、推理服务

为什么需要推理服务（Inference Service）？
推理服务是深度学习模型从训练阶段进入生产环境的关键桥梁，其核心价值在于将训练好的模型转化为实际可用的应用能力。
训练阶段：模型在离线环境中，依赖大量计算资源（如 GPU 集群）进行参数优化，关注模型性能指标（如准确率、损失值）。

推理阶段：模型需在生产环境中实时响应用户请求，关注低延迟、高吞吐量、资源利用率，且需适应动态变化的输入数据。

使用框架（如 FastAPI、Flask）将本地部署模型封装为 RESTful API，提供推理服务。
"""

# from fastapi import FastAPI, HTTPException
# from pydantic import BaseModel
# from transformers import pipeline
#
# # 初始化 FastAPI 应用
# app = FastAPI(title="大模型推理服务", description="基于FastAPI和Hugging Face Transformers")
# # 加载预训练模型（例如文本生成模型）
# model = pipeline("text-generation", model="DeepSeek-R1")
# # 定义请求体模型
# class TextInput(BaseModel):
#     prompt: str
#     max_length: int = 50
#     num_return_sequences: int = 1
#
# # 定义推理接口
# @app.post("/predict")
# async def predict(ibnput: TextInput):
#     try:
#         # 调用模型进行推理
#         result = model(input.prompt, max_length=input.max_length, num_return_sequences=input.num_return_sequences)
#         return {"output": result[0]['generated_text']}
#     except Exception as e:
#         raise HTTPException(status_code=500, detail=str(e))



from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from fastapi import FastAPI, HTTPException

app = FastAPI()
model = LargeModel()
class LargeModel:
    def __init__(self, model_name="DeepSeek-R1"):
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModelForCausalLM.from_pretrained(model_name).to("cuda" if torch.cuda.is_available() else "cpu")
    def generate_response(self, prompt, max_length=50):
        inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
        outputs = self.model.generate(inputs["input_ids"], max_length=max_length)
        return self.tokenizer.decode(outputs[0], skip_special_tokens=True)



@app.post("/generate/")
async def generate_text(prompt: str, max_length: int = 50):
    if not prompt.strip():
        raise HTTPException(status_code=400, detail="Prompt cannot be empty")
    try:
        response = model.generate_response(prompt, max_length=max_length)
        return {"response": response}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# uvicorn my_app:app --host 0.0.0.0 --port 8000 --reload